package sifcom.Entidades.Factory;

import java.io.BufferedReader;
import java.util.ArrayList;
import java.util.List;

import sifcom.Entidades.Canton2;
import sifcom.Entidades.Parroquia;
import sifcom.Entidades.Provincia;
import sifcom.Entidades.Zona;
import sifcom.Utilidades.Utilidades;
import sifcom.json.ManejoJson;

import com.google.appengine.api.datastore.EntityNotFoundException;
import com.google.appengine.repackaged.org.json.JSONException;
import com.google.appengine.repackaged.org.json.JSONObject;
import com.googlecode.objectify.Key;
import com.googlecode.objectify.Objectify;

public class ParroquiaFactory {
	
	public ParroquiaFactory()
	{
		
	}
	
	public ParroquiaFactory(BufferedReader reader) throws JSONException, EntityNotFoundException
	{
		ObjectifyGenericDao<Parroquia> daoObjectify = new ObjectifyGenericDao<Parroquia>(Parroquia.class);
		
		Utilidades util = new Utilidades();
		
		JSONObject jsonSocio = util.getJsonObject(reader);
		
			//Delete
			if(jsonSocio.length() == 1 && jsonSocio.get("id") != null)
			{
				Key<Parroquia> key = new Key<Parroquia>(Parroquia.class,jsonSocio.getLong("id")); 
				
				Objectify ofy = daoObjectify.fact().begin();			
				
				ofy.delete(key);
			}
			
			//Create
			if(jsonSocio.length() > 1 && jsonSocio.get("id").toString().length() == 4)
			{
				Parroquia parr = new Parroquia();
				
				Key<Provincia> keyProvincia = new Key<Provincia>(Provincia.class,jsonSocio.getLong("provincia"));
				Key<Canton2> keyCanton = new Key<Canton2>(Canton2.class,jsonSocio.getLong("canton"));
				Key<Zona> keyZona = new Key<Zona>(Zona.class,jsonSocio.getLong("zona"));
				
				parr.setProvincia(keyProvincia);
				parr.setCanton(keyCanton);
				parr.setParroquia(jsonSocio.getString("parroquia"));
				parr.setZona(keyZona);
				
				Key<Parroquia> key =daoObjectify.put(parr);
				
				System.out.println(key.getId());
				System.out.println(key.getRaw());
			}
		
			//Update
			if(jsonSocio.length() > 1 && !jsonSocio.get("id").toString().equalsIgnoreCase("null"))
			{
				Key<Parroquia> key = new Key<Parroquia>(Parroquia.class,jsonSocio.getLong("id"));
				
				System.out.println("Key: "+key.getId());
				
				Parroquia parr = daoObjectify.get(key);			
				
				if(!jsonSocio.isNull("provincia"))
				{
					Key<Provincia> keyProvincia = new Key<Provincia>(Provincia.class,jsonSocio.getLong("provincia"));
					parr.setProvincia(keyProvincia);
				}
				
				if(!jsonSocio.isNull("canton"))
				{
					Key<Canton2> keyCanton = new Key<Canton2>(Canton2.class,jsonSocio.getLong("canton"));
					parr.setCanton(keyCanton);
				}
				
				if(!jsonSocio.isNull("zona"))
				{				
					Key<Zona> keyZona = new Key<Zona>(Zona.class,jsonSocio.getLong("zona"));
					parr.setZona(keyZona);
				}							
				
				parr.setParroquia(jsonSocio.getString("parroquia"));
				
				
				daoObjectify.put(parr);				
			}
	}
	
	public String getData() throws EntityNotFoundException{
		
		ObjectifyGenericDao<Parroquia> daoObjectify = new ObjectifyGenericDao<Parroquia>(Parroquia.class);		
		
		List<Parroquia> lst = daoObjectify.listByExample(new Parroquia());

		return setData(lst);
	}

	public String Search(String parroquia) throws EntityNotFoundException{
		
		ObjectifyGenericDao<Parroquia> daoObjectify = new ObjectifyGenericDao<Parroquia>(Parroquia.class);
		Parroquia parr = new Parroquia();
		if(parroquia.length()>=1)
			parr.setParroquia(parroquia);
		
		List<Parroquia> lst = daoObjectify.listByExample(parr);

		return setData(lst);
	}	
	
	private String setData(List<Parroquia> lst) throws EntityNotFoundException
	{
		JSONObject json = new JSONObject();
		List<String> array= new ArrayList<String>();
		
		for(Parroquia entidad : lst)
		{			
				try {
					json.put("id", entidad.getId());
					json.put("provincia", entidad.getProvincia().getId());
					json.put("canton", entidad.getCanton().getId());
					json.put("parroquia",entidad.getParroquia());
					json.put("zona", entidad.getZona().getId());
					
					array.add(json.toString());
					
				} catch (JSONException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}								
		}						
		
		String myOut = "{\"success\":true,\"message\":\"Datos Cargados\",\"data\":"+array.toString()+"}"; 
		
		return myOut;
	}
			
}
